#include "libDisco.h"

static datosDisco_t datosDisco;
static pthread_mutex_t mutexDisco = PTHREAD_MUTEX_INITIALIZER;

uint8_t inicializarDisco(char *path){
	printf("===============================================================================\n");
	printf("Inicializando disco...\n");
	printf("-------------------------------------------------------------------------------\n");
	int32_t disco;
    if ((disco = open(path, O_RDWR)) == -1) {
        printf("No se pudo abrir el disco\n");
    	return 1;
    }
    datosDisco.tamanio = lseek(disco, 0, SEEK_END);
    printf("Ruta: %s\n", path);
    printf("Tamaño: %d\n", datosDisco.tamanio);
    lseek(disco, 0 , SEEK_SET);
    if((datosDisco.ptrDisco = mmap(NULL, datosDisco.tamanio, (PROT_READ|PROT_WRITE), MAP_PRIVATE, disco , 0)) == MAP_FAILED){
    	printf("Error al mapear el disco \n");
    	return 2;
    } else {
    	printf("Disco inicializado\n");
    }

	return 0;
}

char* leerBytes(off_t offset, size_t size){
	char* lectura = malloc(size);
	pthread_mutex_lock(&mutexDisco);
	memcpy(lectura, datosDisco.ptrDisco +offset,size);
	pthread_mutex_unlock(&mutexDisco);
	return lectura;
}

void escribirBytes(off_t offset, size_t size, char* info){
	pthread_mutex_lock(&mutexDisco);
	memcpy(datosDisco.ptrDisco +offset, info ,size);
	pthread_mutex_unlock(&mutexDisco);

}

void finalizarDisco(void){
	pthread_mutex_lock(&mutexDisco);
	msync(datosDisco.ptrDisco, datosDisco.tamanio, MS_SYNC);
	munmap(datosDisco.ptrDisco, datosDisco.tamanio);
	pthread_mutex_unlock(&mutexDisco);
}
